/*-------------------------------------------------------------------------
 *
 * queryjumble.h
 *	  查询标准化和指纹提取。
 *
 * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
 * Portions Copyright (c) 1994, Regents of the University of California
 *
 * IDENTIFICATION
 *	  src/include/utils/queryjumble.h
 *
 *-------------------------------------------------------------------------
 */
#ifndef QUERYJUBLE_H
#define QUERYJUBLE_H

#include "nodes/parsenodes.h"

#define JUMBLE_SIZE				1024	/* 查询序列化缓冲区大小 */

/*
 * 结构用于在规范化期间跟踪常量的位置/长度
 */
typedef struct LocationLen
{
	int			location;		/* 查询文本中的起始偏移量 */
	int			length;			/* 以字节为单位的长度，或 -1 表示忽略 */
} LocationLen;

/*
 * 计算查询混乱并生成规范化查询字符串的工作状态
 */
typedef struct JumbleState
{
	/* 当前查询树的混乱 */
	unsigned char *jumble;

	/* 使用在 jumble[] 中的字节数 */
	Size		jumble_len;

	/* 需要移除的常量的位置数组 */
	LocationLen *clocations;

	/* clocations 数组的分配长度 */
	int			clocations_buf_size;

	/* clocations 数组中当前有效条目的数量 */
	int			clocations_count;

	/* 我们看到的最高 Param id，以正确开始标准化 */
	int			highest_extern_param_id;
} JumbleState;

/* compute_query_id GUC 的值 */
enum ComputeQueryIdType
{
	COMPUTE_QUERY_ID_OFF,
	COMPUTE_QUERY_ID_ON,
	COMPUTE_QUERY_ID_AUTO,
	COMPUTE_QUERY_ID_REGRESS
};

/* GUC 参数 */
extern PGDLLIMPORT int compute_query_id;


extern const char *CleanQuerytext(const char *query, int *location, int *len);
extern JumbleState *JumbleQuery(Query *query, const char *querytext);
extern void EnableQueryId(void);

extern PGDLLIMPORT bool query_id_enabled;

/*
 * 返回查询标识符计算是否已启用，既可以
 * 直接在 GUC 中设置，也可以在设置为 'auto' 的情况下由模块设置。
 */
static inline bool
IsQueryIdEnabled(void)
{
	if (compute_query_id == COMPUTE_QUERY_ID_OFF)
		return false;
	if (compute_query_id == COMPUTE_QUERY_ID_ON)
		return true;
	return query_id_enabled;
}

#endif							/* QUERYJUMBLE_H */
